﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GIFT
{
    public partial class VentanaLista : Form
    {

        //Constructor de la clase
        public VentanaLista(String nombre, InterfazPrincipal vPrincipal)
        {
            controlLista = new ControlLista();
            modificado = false;
            Principal = vPrincipal;
            Nombre = nombre; //pone el nombre
            InitializeComponent();
            this.Name = Nombre;
            this.Text = Nombre;
            campoNombreLista.Text = Nombre;
            campoActualizacionLista.Text = DateTime.Now.ToString();
            defecto = "";
            antesEdicion = "";
            despuesEdicion = "";
            modoEdicion = false;
        }

        ///Metodos set

        //El valor al campo correlativo
        public void setCorrelativo(String correlativo)
        {
            campoCorrelativoLista.Text = correlativo;
        }

        //El valor al campo nombre
        public void setNombre(String nombre)
        {
            campoNombreLista.Text = nombre;
        }

        //El valor al campo descripcion
        public void setDescripcion(String descripcion)
        {
            campoDescripcionLista.Text = descripcion;
        }

        //El valor al campo fecha actualizacion
        public void setActualizacion(String fechaActualizacion)
        {
            campoActualizacionLista.Text = fechaActualizacion;
        }

        //El valor del orden de la lista
        public void setOrden(String orden) 
        {
            if (orden == "1")
            {
                checkBoxOrdenLista.Checked = true;
            }
            else { checkBoxOrdenLista.Checked = false; }
        }

        //El Valor del termino por defecto de la lista
        public void setDefecto(String defc) 
        {
            defecto = defc;        
        }

        //Le da valores a la lista
        public void setLista (ArrayList lista)
        {
            for (int i = 0; i < lista.Count; ++i) 
            {
                DataGridViewRow fila = new DataGridViewRow();
                fila.CreateCells(lista_Lista, new object[] { lista[i].ToString() });
                if (defecto == lista[i].ToString())
                {
                    Font font = new Font(lista_Lista.DefaultCellStyle.Font.FontFamily, 10, FontStyle.Bold);
                    fila.DefaultCellStyle.Font = font;
                }

                lista_Lista.Rows.Add(fila);
            }
        }


        //Metodos Get

        //Retorna el valor al campo correlativo
        public String getCorrelativo()
        {
            return campoCorrelativoLista.Text;
        }

        //Retorna el  valor al campo nombre
        public String getNombre()
        {
            return Nombre;
        }

        //Retorna el  valor al campo descripcion
        public String getDescripcion()
        {
            return campoDescripcionLista.Text;
        }

        //Retorna el  valor al campo fecha actualizacion
        public String getActualizacion()
        {
            return campoActualizacionLista.Text;
        }

        //Retorna el  valor del orden de la lista
        public bool getOrden()
        {
            return checkBoxOrdenLista.Checked;
        }

        public String getDefecto() 
        {
            return defecto;
        }


        //Cambia la habilitacion del boton guardar
        public void habilitacionBotonGuardar(bool habilitacion)
        {
            botonGuardarLista.Enabled = habilitacion;
        }

        //Captura el click en el boton cerrar el form
        private void botonCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //Captura el click en el boton borrar de el form
        private void botonEliminar_Click(object sender, EventArgs e)
        {
            borrarArchivo();
        }

        //Captura el click en el boton guardar de el form
        private void botonGuardar_Click(object sender, EventArgs e)
        {
            guardarArchivo();//manda a guardar el archivo
        }

        //Captura el click en el boton guardarComo de el form
        private void botonGuardarComo_Click(object sender, EventArgs e)
        {
            hacerCopia();
        }

        //Captura el evento que suceda antes de cerrar la ventana
        private void click_cerrarVentana(object sender, FormClosingEventArgs e)
        {
            if (modificado)
            {
                guardarArchivo();
            }
            Principal.ventanaEnfocada(null, ""); //Manda a quitarse como la enfocada
        }

        //Se da cuenta cuando se hicieron cambios
        public void seHicieronCambios(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            this.modificado = true;
            botonGuardarLista.Enabled = true;
        }

        //Se da cuenta cuando se hicieron cambios
        private void seHicieronCambios(object sender, EventArgs e)
        {
            if (Principal.estaAbierta(Nombre))
            {
                this.modificado = true;
                botonGuardarLista.Enabled = true;
            }
            Principal.ventanaEnfocada(null, ""); //Manda a quitarse como la enfocada
        }

        //Manda a borrar el archivo
        public void borrarArchivo()
        {
            //confirma el borrado
            DialogResult dr = MessageBox.Show("Está seguro que desea borrar la lista?", "Borrar lista", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (dr)
            {
                case DialogResult.Yes: //en caso de que desee borrarlo
                    controlLista.borrar(Nombre);
                    Principal.habilitacionCampos();
                    Principal.GetControlInterfaz().quitarNodo(Principal.GetTreeView(), Nombre, "lista");
                    this.Close();
                    break;
                case DialogResult.No: break;
            }
        }

        //Manda a hacer una copia del numero
        public void hacerCopia()
        {
            GuardarComo guardar = new GuardarComo(Principal, "lista", this);
            guardar.Show();
        }

        //Manda a guardar un archivo
        public void guardarArchivo()
        {
            //confirma el guardado
            DialogResult dr = MessageBox.Show("Desea guardar los cambios de "+ Nombre +"?", "Guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (dr)
            {
                case DialogResult.Yes: //en caso de que desee guardar
                    //manda a modificar la lista
                    controlLista.modificarLista(getNombre(), getDescripcion(), getOrden());
                    Principal.habilitacionCampos();
                    this.modificado = false;
                    this.botonGuardarLista.Enabled = false;
                    break;
                case DialogResult.No: break;
            }
        }

        //Captura el evento de clic en una celda de la lista
        void lista_Lista_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            boton_borrar_termino_Lista.Enabled = true;
            boton_pordefecto_termino_Lista.Enabled = true;
            if (checkBoxOrdenLista.Checked == false)
            {
                botonSubirTermino.Enabled = true;
                botonBajarTermino.Enabled = true;
            }
        }

        //Captura el evento de doble clic en un elemento de la lista
        void lista_Lista_DoubleClick(object sender, EventArgs e)
        {
            boton_agregar_termino_Lista.Enabled = true;
            boton_borrar_termino_Lista.Enabled = false;
            boton_pordefecto_termino_Lista.Enabled = false;
            campoAgregarTerminoLista.Text = ((DataGridView)sender).SelectedCells[0].Value.ToString();
            campoAgregarTerminoLista.Focus();
            campoAgregarTerminoLista.SelectAll();
            antesEdicion = campoAgregarTerminoLista.Text;
            modoEdicion = true;
        }

        //Agrega  o modifica un termino en la lista
        private void agregaModificaTerminoLista()
        {
            if (modoEdicion)//edicion de un termino
            {
                despuesEdicion = campoAgregarTerminoLista.Text;
                if (controlLista.existeTermino(campoAgregarTerminoLista.Text, this.getCorrelativo())) //ya existe uno con ese nombre
                {
                    MessageBox.Show("Ya existe un término con ese nombre", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    antesEdicion = "";
                    despuesEdicion = "";
                    modoEdicion = false;
                    return;
                }

                //cambiar el nombre en la base y en la lista
                controlLista.modificaTermino(getCorrelativo(), antesEdicion, despuesEdicion);

                DataGridViewCell celda =  lista_Lista.SelectedCells[0];
                celda.Value = despuesEdicion;
                if (this.getOrden())
                {
                    ListSortDirection direccion = ListSortDirection.Ascending;
                    DataGridViewColumn col = lista_Lista.Columns[0];
                    lista_Lista.Sort(col, direccion);
                }
                estableceOrdenTerminos();

                antesEdicion = "";
                despuesEdicion = "";
                modoEdicion = false;
            }
            else
            {
                if (controlLista.existeTermino(campoAgregarTerminoLista.Text, this.getCorrelativo())) //ya existe uno con ese nombre
                {
                    MessageBox.Show("Ya existe un término con ese nombre", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    campoAgregarTerminoLista.Text = "";
                    return;
                }
                else
                {
                    controlLista.crearTermino(campoAgregarTerminoLista.Text, getCorrelativo(), lista_Lista.Rows.Count.ToString());
                    DataGridViewRow fila = new DataGridViewRow();
                    fila.CreateCells(lista_Lista, new object[] { campoAgregarTerminoLista.Text });
                    lista_Lista.Rows.Add(fila);
                    if (this.getOrden())
                    {
                        ListSortDirection direccion = ListSortDirection.Ascending;
                        DataGridViewColumn col = lista_Lista.Columns[0];
                        lista_Lista.Sort(col, direccion);
                        estableceOrdenTerminos();
                    }
                    campoAgregarTerminoLista.Text = "";
                }
            }
        }

        //Captura evento cuando se deja de editar un termino
        void campoActualizacionLista_Leave(object sender, EventArgs e)
        {
            antesEdicion = "";
            despuesEdicion = "";
            modoEdicion = false;
        }

        //Captura el evento de clic en el boton de agregar un termino en la lista
        private void boton_agregar_termino_Lista_Click(object sender, EventArgs e)
        {
            agregaModificaTerminoLista();
            seHicieronCambios(null, null);
        }

        //Captura eventos en el textbox utilizado para agregar terminos en la lista
        void campoAgregarTerminoLista_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                string vacio = campoAgregarTerminoLista.Text.Trim();
                if ((vacio == "") || (vacio.Length == 1)) { boton_agregar_termino_Lista.Enabled = false; boton_borrar_termino_Lista.Enabled = false; boton_pordefecto_termino_Lista.Enabled = false; }
            }
            if (e.KeyValue == 17)  //Ctrl+X (Cut)
            {
                string seleccionado = campoAgregarTerminoLista.SelectedText.Trim();
                string vacio = campoAgregarTerminoLista.Text.Trim();
                if ((vacio == "") || (vacio.Length - seleccionado.Length < 1)) { boton_agregar_termino_Lista.Enabled = false; }
            }
        }

        //Captura eventos en el textbox utilizado para agregar terminos en la lista
        void campoAgregarTerminoLista_KeyPress(object sender, KeyPressEventArgs e)
        {
            string vacio = campoAgregarTerminoLista.Text.Trim(); //texto sin espacios en blanco

            if ((vacio == "" && (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Delete)) || (vacio.Length == 1 && (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Delete))) { boton_agregar_termino_Lista.Enabled = false; }
            else
            {
                if (e.KeyChar == 13 && campoAgregarTerminoLista.Text != "") { 
                    agregaModificaTerminoLista(); }
                else
                {
                    if (e.KeyChar != (char)Keys.Enter && e.KeyChar != (char)Keys.Tab && e.KeyChar != (char)Keys.Space && e.KeyChar != (char)Keys.Left && e.KeyChar != (char)Keys.Right && e.KeyChar != (char)Keys.Up && e.KeyChar != (char)Keys.Down)
                    {
                        if (campoAgregarTerminoLista.Text + e.KeyChar != "") { boton_agregar_termino_Lista.Enabled = true; boton_borrar_termino_Lista.Enabled = false; boton_pordefecto_termino_Lista.Enabled = false; }
                    }
                }
            }
        }

        //Captura evento de cambios en el orden de la lista(ordenada o no ordenada)
        private void checkBoxOrdenLista_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxOrdenLista.Checked == true)
            {
                botonSubirTermino.Enabled = false;
                botonBajarTermino.Enabled = false;
                ListSortDirection direccion = ListSortDirection.Ascending;
                DataGridViewColumn col = lista_Lista.Columns[0];
                lista_Lista.Sort(col, direccion);
                estableceOrdenTerminos();
                controlLista.estableceOrdenLista(getOrden(), getCorrelativo());
             }
             else
             {
                botonSubirTermino.Enabled = true;
                botonBajarTermino.Enabled = true;
                controlLista.estableceOrdenLista(getOrden(), getCorrelativo());
             }
        }

        //Establece el orden que tienen los terminos en la lista
        private void estableceOrdenTerminos()
        {
            DataGridViewCell celda;
            for (int i = 0; i < lista_Lista.Rows.Count; ++i)
            {
                celda = lista_Lista.Rows[i].Cells[0];
                controlLista.estableceOrdenTermino(celda.Value.ToString(), i.ToString(), getCorrelativo());
            }
        }

        //Captura el evento para eliminar un elemento o termino seleccionado de la lista
        private void boton_borrar_termino_Lista_Click(object sender, EventArgs e)
        {
            String termino = lista_Lista.SelectedRows[0].Cells[0].Value.ToString();
            if (termino != "")
            {
                bool borrardefecto = false;
                if (termino == getDefecto()) //se quiere borrar el defecto
                {
                    DialogResult dr = MessageBox.Show("Está seguro que desea que desea eliminar el valor por defecto?",
                          "Valor Por Defecto", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    switch (dr)
                    {
                        case DialogResult.Yes:
                            borrardefecto = true;
                            break;
                        case DialogResult.No:
                            foreach (DataGridViewCell c in lista_Lista.SelectedCells) { c.Selected = false; }
                            boton_borrar_termino_Lista.Enabled = false;
                            boton_pordefecto_termino_Lista.Enabled = false;
                            return;
                    }
                }

                if (!borrardefecto)
                {
                    DialogResult dr = MessageBox.Show("Está seguro que desea que desea eliminar el término?",
                          "Eliminar Término", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    switch (dr)
                    {
                        case DialogResult.Yes:
                            break;
                        case DialogResult.No:
                            foreach (DataGridViewCell c in lista_Lista.SelectedCells) { c.Selected = false; }
                            boton_borrar_termino_Lista.Enabled = false;
                            boton_pordefecto_termino_Lista.Enabled = false;
                            return;
                    }
                }
                controlLista.eliminaTermino(termino, getCorrelativo());
                if (borrardefecto)
                {
                    controlLista.estableceDefectoLista("NULL", getCorrelativo());
                }
                lista_Lista.Rows.Remove(lista_Lista.SelectedRows[0]);
                estableceOrdenTerminos();
                
            }
            boton_borrar_termino_Lista.Enabled = false;
            boton_pordefecto_termino_Lista.Enabled = false;
            seHicieronCambios(null, null);
        }

        //Captura el evento para establecer un termino seleccionado como defecto de la lista
        private void boton_pordefecto_termino_Lista_Click(object sender, EventArgs e)
        {
            String termino = lista_Lista.SelectedRows[0].Cells[0].Value.ToString();
            if (termino != "")
            {
                if (getDefecto() != termino)
                {
                    DialogResult dr = MessageBox.Show("Está seguro que desea que desea cambiar el valor por defecto?",
                          "Valor Por Defecto", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    switch (dr)
                    {
                        case DialogResult.Yes:
                            break;
                        case DialogResult.No:
                            foreach (DataGridViewCell c in lista_Lista.SelectedCells) { c.Selected = false; }
                            boton_borrar_termino_Lista.Enabled = false;
                            boton_pordefecto_termino_Lista.Enabled = false;
                            return;
                    }
                    foreach (DataGridViewRow c in lista_Lista.Rows) { if (c.Cells[0].Value.ToString() == getDefecto()) { c.DefaultCellStyle.Font = null; } }
                }

                DataGridViewRow fila1 = lista_Lista.SelectedRows[0];
                Font font = new Font(lista_Lista.DefaultCellStyle.Font.FontFamily, 10, FontStyle.Bold);
                fila1.DefaultCellStyle.Font = font;

                String temp = lista_Lista.SelectedRows[0].Cells[0].Value.ToString();

                String idTermino = controlLista.obtieneIDTermino(lista_Lista.SelectedRows[0].Cells[0].Value.ToString(), getCorrelativo());
                controlLista.estableceDefectoLista(idTermino, getCorrelativo());
            }
            foreach (DataGridViewCell c in lista_Lista.SelectedCells) { c.Selected = false; }
            boton_borrar_termino_Lista.Enabled = false;
            boton_pordefecto_termino_Lista.Enabled = false;
            seHicieronCambios(null, null);
        }

        private void botonSubirTermino_Click(object sender, EventArgs e)
        {
            if (lista_Lista.Rows.Count > 0)
            {
                DataGridViewRow fila = lista_Lista.SelectedRows[0];
                DataGridViewCell filaContenido = lista_Lista.SelectedCells[0];
                if (fila.Index != 0)
                {
                    DataGridViewRow filaContinua = lista_Lista.Rows[fila.Index - 1];
                    DataGridViewCell filaContinuaContenido = lista_Lista[0, filaContenido.RowIndex - 1];

                    controlLista.estableceOrdenTermino(filaContenido.Value.ToString(), (filaContenido.RowIndex - 1).ToString(), getCorrelativo());
                    controlLista.estableceOrdenTermino(filaContinuaContenido.Value.ToString(), (filaContenido.RowIndex).ToString(), getCorrelativo());

                    String valor = filaContinuaContenido.Value.ToString();
                    filaContinuaContenido.Value = filaContenido.Value;
                    filaContenido.Value = valor;
                    Font fuente = filaContinua.DefaultCellStyle.Font;
                    filaContinua.DefaultCellStyle.Font = fila.DefaultCellStyle.Font;
                    fila.DefaultCellStyle.Font = fuente;
                    lista_Lista.CurrentCell = lista_Lista[0, filaContenido.RowIndex - 1];
                }
            }
            seHicieronCambios(null, null);
        }

        private void botonBajarTermino_Click(object sender, EventArgs e)
        {
            if (lista_Lista.Rows.Count > 0)
            {
                DataGridViewRow fila = lista_Lista.SelectedRows[0];
                DataGridViewCell filaContenido = lista_Lista.SelectedCells[0];
                if (filaContenido.RowIndex < lista_Lista.Rows.Count - 1)
                {
                    DataGridViewRow filaContinua = lista_Lista.Rows[fila.Index + 1];
                    DataGridViewCell filaContinuaContenido = lista_Lista[0, filaContenido.RowIndex + 1];

                    controlLista.estableceOrdenTermino(filaContenido.Value.ToString(), (filaContenido.RowIndex + 1).ToString(), getCorrelativo());
                    controlLista.estableceOrdenTermino(filaContinuaContenido.Value.ToString(), (filaContenido.RowIndex).ToString(), getCorrelativo());

                    String valor = filaContinuaContenido.Value.ToString();
                    filaContinuaContenido.Value = filaContenido.Value;
                    filaContenido.Value = valor;
                    Font fuente = filaContinua.DefaultCellStyle.Font;
                    filaContinua.DefaultCellStyle.Font = fila.DefaultCellStyle.Font;
                    fila.DefaultCellStyle.Font = fuente;
                    lista_Lista.CurrentCell = lista_Lista[0, filaContenido.RowIndex + 1];
                }
            }
            seHicieronCambios(null, null);
        }

        public string listaTerminos()
        {
            string resultado = "";
            foreach (DataGridViewRow c in lista_Lista.Rows)
            {
                resultado += "- " + c.Cells[0].Value.ToString() + "\n";
            }
            return resultado;
        }

        //Captura el evento de cuando la ventana es enfocada
        private void VentanaEnfocada(object sender, EventArgs e)
        {
            Principal.ventanaEnfocada(this, "lista"); //Manda a ponerse como la enfocada
        }

        //Captura el evento de cuando la ventana es desenfocada
        private void VentanaDesenfocada(object sender, EventArgs e)
        {
            Principal.ventanaEnfocada(null, ""); //Manda a quitarse como la enfocada
        }
    }//Fin de la clase
}
